<?php

/**
 *
 * <b>Classe AnimalDAO</b>
 *
 * <p>
 *   Responsável por manipular informações ao banco de dados realizando CRUD
 *   e validando regras de negócio da aplicação
 * </p>
 *
 * @author     Bruno Pulis <bruno.pulis@gmail.com>
 * @version    1.0
 * @package    Model
 * @subpackage DAO
 * @copyright  2011 Bruno Pulis
 */

/**
 * Require de conexao do banco de dados
 */

require 'ConnectionPDO.php';
class AnimalDAO extends ConnectionPDO {

	public $connection = null;

	// Construtor da Classe
	public function __construct()
	{
		$this->connection = ConnectionPDO::connect();
	}

	/**
	 * addAnimal()
	 *
	 * Método responsável por inserir registros dos animais
	 *
	 * @author  Bruno Pulis <bruno.pulis@gmail.com>
	 * @access  public
	 * @param   Animal $animal - Objeto animal preenchido
	 * @return  resource
	 */
	public function addAnimal(Animal $animal)
	{
		try {
			$sql = 'INSERT INTO animal(nome,
                                       foto,
                                       raca,
                                       tipoAnimal,
                                       sexo,
                                       pelagem,
                                       nascimento,
                                       municipio,
                                       peso,
                                       url,
                                       obs,
                                       IDFiliacao)
                       VALUES(?,?,?,?,?,?,?,?,?,?,?,?)';

			$rs = $this->connection->prepare($sql);
			$rs->bindParam(1, $animal->getNomeAnimal());
			$rs->bindParam(2, $animal->getFoto());
			$rs->bindParam(3, $animal->getRaca());
			$rs->bindParam(4, $animal->getTipoAnimal());
			$rs->bindParam(5, $animal->getSexoAnimal());
			$rs->bindParam(6, $animal->getPelagemAnimal());
			$rs->bindParam(7, $animal->getDataNasc());
			$rs->bindParam(8, $animal->getMunicipio());
			$rs->bindParam(9, $animal->getPeso());
			$rs->bindParam(10, $animal->getVideo());
			$rs->bindParam(11, $animal->getObservacao());
			$rs->bindParam(12, $animal->getFiliacao());
			$rs->execute();
		} catch (PDOException $e) {
			echo $e->getMessage();
		}
	}

	/**
	 *  getAllAnimal()
	 *
	 *  Metodo responsavel por listar todos registros de animais
	 *
	 * @author Bruno Pulis <bruno.pulis@gmail.com>
	 * @access public
	 * @return resource
	 */
	public function getAllAnimal()
	{
		try {
			$sql = 'SELECT
                          IDAnimal,
                          nome,
                          raca,
                          tipoAnimal,
                          pelagem,
                          sexo,
                          foto,
                          date_format(nascimento, "%d/%m/%Y") AS nascimento,
                          peso,
                          url,
                          obs,
                          municipio,
                          Filiacao.pai,
                          Filiacao.mae
                     FROM animal
                     INNER JOIN filiacao
                     ON filiacao.IDFiliacao = animal.IDFiliacao';

			return $rs  = $this->connection->query($sql);

			// Fecha conexao
			$this->connection = null;
		} catch (PDOException $e) {
			$this->connection->rollBack();
			echo 'Erro <code>' .  $e->getMessage() . '</code>';
		}
	}

	/**
	 *  getTouroGuzera()
	 *
	 *  Metodo responsavel por listar todos registros da raça Guzera
	 *
	 * @author Bruno Pulis <bruno.pulis@gmail.com>
	 * @access public
	 * @return resource
	 */
	public function getTouroGuzera()
	{
		try {
				$sql = 'SELECT
                          IDAnimal,
                          nome,
                          raca,
                          tipoAnimal,
                          pelagem,
                          sexo,
                          foto,
                          date_format(nascimento, "%d/%m/%Y") AS nascimento,
                          peso,
                          url,
                          obs,
                          municipio,
                          Filiacao.pai,
                          Filiacao.mae
                     FROM animal
                     INNER JOIN filiacao
                     ON filiacao.IDFiliacao = animal.IDFiliacao
                     WHERE raca       = "Guzera"
                     AND   tipoAnimal = "Touro"
                     AND   sexo       = "Macho"';

			return  $rs  = $this->connection->query($sql);
			$this->connection = null;
		} catch (PDOException $e) {
			$this->connection->rollBack();
			echo 'Erro <code>' .  $e->getMessage() . '</code>';
		}
	}

	/**
	 *  getMatrizGuzera()
	 *
	 *  Metodo responsavel por listar todos registros da raça Guzera
	 *
	 * @author Bruno Pulis <bruno.pulis@gmail.com>
	 * @access public
	 * @return resource
	 */
	public function getMatrizGuzera()
	{
		try {
			$sql = 'SELECT
                          IDAnimal,
                          nome,
                          raca,
                          tipoAnimal,
                          pelagem,
                          sexo,
                          foto,
                          date_format(nascimento, "%d/%m/%Y") AS nascimento,
                          peso,
                          url,
                          obs,
                          municipio,
                          Filiacao.pai,
                          Filiacao.mae
                     FROM animal
                     INNER JOIN filiacao
                     ON filiacao.IDFiliacao = animal.IDFiliacao
                     WHERE raca 	   = "Guzerá"
                     AND   tipoAnimal  = "Matrizes"
					 AND   sexo        = "Femea"';

			return $rs  = $this->connection->query($sql);
			$this->connection = null;
				
		} catch (PDOException $e) {
			echo 'Erro <code>' .  $e->getMessage() . '</code>';
		}
	}


	/**
	 *  getTouroGir()
	 *
	 *  Metodo responsavel por listar todos registros da raça Gir
	 *
	 * @author Bruno Pulis <bruno.pulis@gmail.com>
	 * @access public
	 * @return resource
	 */
	public function getTouroGir()
	{
		try {
			$sql = 'SELECT
                          IDAnimal,
                          nome,
                          raca,
                          tipoAnimal,
                          pelagem,
                          sexo,
                          foto,
                          date_format(nascimento, "%d/%m/%Y") AS nascimento,
                          peso,
                          url,
                          obs,
                          municipio,
                          Filiacao.pai,
                          Filiacao.mae
                     FROM animal
                     INNER JOIN filiacao
                     ON filiacao.IDFiliacao = animal.IDFiliacao
                     WHERE raca       = "Gir Leiteiro"
                     AND   tipoAnimal = "Touro"
					 AND   sexo       = "Macho"';

			return $rs  = $this->connection->query($sql);
			$this->connection = null;
				
		} catch (PDOException $e) {
			echo 'Erro <code>' .  $e->getMessage() . '</code>';
		}
	}

	/**
	 *  getMatrizGir()
	 *
	 *  Metodo responsavel por listar todos registros da raça Gir Leiteiro
	 *
	 * @author Bruno Pulis <bruno.pulis@gmail.com>
	 * @access public
	 * @return resource
	 */
	public function getMatrizGir()
	{
		try {
			$sql = 'SELECT
                          IDAnimal,
                          nome,
                          raca,
                          tipoAnimal,
                          pelagem,
                          sexo,
                          foto,
                          date_format(nascimento, "%d/%m/%Y") AS nascimento,
                          peso,
                          url,
                          obs,
                          municipio,
                          Filiacao.pai,
                          Filiacao.mae
                     FROM animal
                     INNER JOIN filiacao
                     ON filiacao.IDFiliacao = animal.IDFiliacao
                     WHERE raca 	   = "Gir Leiteiro"
                     AND   tipoAnimal  = "Matrizes"
					 AND   sexo        = "Femea"';

			return $rs  = $this->connection->query($sql);
			$this->connection = null;
				
		} catch (PDOException $e) {
			echo 'Erro <code>' .  $e->getMessage() . '</code>';
		}
	}
	
	/**
	 *  getTouroSimental()
	 *
	 *  Metodo responsavel por listar todos registros da raça Simental
	 *
	 * @author Bruno Pulis <bruno.pulis@gmail.com>
	 * @access public
	 * @return resource
	 */
	public function getTouroSimental()
	{
		try {
			$sql = 'SELECT
                          IDAnimal,
                          nome,
                          raca,
                          tipoAnimal,
                          pelagem,
                          sexo,
                          foto,
                          date_format(nascimento, "%d/%m/%Y") AS nascimento,
                          peso,
                          url,
                          obs,
                          municipio,
                          Filiacao.pai,
                          Filiacao.mae
                     FROM animal
                     INNER JOIN filiacao
                     ON filiacao.IDFiliacao = animal.IDFiliacao
                     WHERE raca       = "Simental"
                     AND   tipoAnimal = "Touro"
					 AND   sexo       = "Macho"';

			return $rs  = $this->connection->query($sql);
			$this->connection = null;
				
		} catch (PDOException $e) {
			echo 'Erro <code>' .  $e->getMessage() . '</code>';
		}
	}

	/**
	 *  getMatrizSimental()
	 *
	 *  Metodo responsavel por listar todos registros da raça Simental
	 *
	 * @author Bruno Pulis <bruno.pulis@gmail.com>
	 * @access public
	 * @return resource
	 */
	public function getMatrizSimental()
	{
		try {
			$sql = 'SELECT
                          IDAnimal,
                          nome,
                          raca,
                          tipoAnimal,
                          pelagem,
                          sexo,
                          foto,
                          date_format(nascimento, "%d/%m/%Y") AS nascimento,
                          peso,
                          url,
                          obs,
                          municipio,
                          Filiacao.pai,
                          Filiacao.mae
                     FROM animal
                     INNER JOIN filiacao
                     ON filiacao.IDFiliacao = animal.IDFiliacao
                     WHERE raca 	   = "Simental"
                     AND   tipoAnimal  = "Matrizes"
					 AND   sexo        = "Femea"';

			return $rs  = $this->connection->query($sql);
			$this->connection = null;
				
		} catch (PDOException $e) {
			echo 'Erro <code>' .  $e->getMessage() . '</code>';
		}
	}
	
	/**
	 *  getTouroPampa()
	 *
	 *  Metodo responsavel por listar todos registros da raça Pampa
	 *
	 * @author Bruno Pulis <bruno.pulis@gmail.com>
	 * @access public
	 * @return resource
	 */
	public function getTouroPampa()
	{
		try {
			$sql = 'SELECT
                          IDAnimal,
                          nome,
                          raca,
                          tipoAnimal,
                          pelagem,
                          sexo,
                          foto,
                          date_format(nascimento, "%d/%m/%Y") AS nascimento,
                          peso,
                          url,
                          obs,
                          municipio,
                          Filiacao.pai,
                          Filiacao.mae
                     FROM animal
                     INNER JOIN filiacao
                     ON filiacao.IDFiliacao = animal.IDFiliacao
                     WHERE raca       = "Pampa"
                     AND   tipoAnimal = "Touro"
					 AND   sexo       = "Macho"';

			return $rs  = $this->connection->query($sql);
			$this->connection = null;
				
		} catch (PDOException $e) {
			echo 'Erro <code>' .  $e->getMessage() . '</code>';
		}
	}

	/**
	 *  getMatrizSimental()
	 *
	 *  Metodo responsavel por listar todos registros da raça Gir Leiteiro
	 *
	 * @author Bruno Pulis <bruno.pulis@gmail.com>
	 * @access public
	 * @return resource
	 */
	public function getMatrizPampa()
	{
		try {
			$sql = 'SELECT
                          IDAnimal,
                          nome,
                          raca,
                          tipoAnimal,
                          pelagem,
                          sexo,
                          foto,
                          date_format(nascimento, "%d/%m/%Y") AS nascimento,
                          peso,
                          url,
                          obs,
                          municipio,
                          Filiacao.pai,
                          Filiacao.mae
                     FROM animal
                     INNER JOIN filiacao
                     ON filiacao.IDFiliacao = animal.IDFiliacao
                     WHERE raca 	   = "Pampa"
                     AND   tipoAnimal  = "Matrizes"
					 AND   sexo        = "Femea"';

			return $rs  = $this->connection->query($sql);
			$this->connection = null;
				
		} catch (PDOException $e) {
			echo 'Erro <code>' .  $e->getMessage() . '</code>';
		}
	}
	
	/**
	 *
	 * getByIDAnimal()
	 *
	 * Método responsavel por listar um único registro.
	 *
	 * @author  Bruno Pulis <bruno.pulis@gmail.com>
	 * @access  public
	 * @param   $idAnimal - Busca pelo identificador do animal
	 * @return  Array
	 */
	public function getByIDAnimal($idAnimal)
	{
		try {
			$sql = 'SELECT
                         nome,
                         foto,
                         raca,
                         tipoAnimal,
                         sexo,
                         pelagem,
                         nascimento,
                         municipio,
                         peso,
                         IDFiliacao
                     FROM animal
                     WHERE IDAnimal = ?';

			$stmt = $this->connection->prepare($sql);

			if ($stmt->execute(array($idAnimal)))
			{
				while ($linha = $stmt->fetch())
				{
					$valores = new Animal();
					$valores->setNomeAnimal($linha['nome']);
					$valores->setFoto($linha['foto']);
					$valores->setRaca($linha['raca']);
					$valores->setTipoAnimal($linha['tipoAnimal']);
					$valores->setSexoAnimal($linha['sexo']);
					$valores->setPelagemAnimal($linha['pelagem']);
					$valores->setDataNasc($linha['nascimento']);
					$valores->setMunicipio($linha['municipio']);
					$valores->setPeso($linha['peso']);
					$valores->setFiliacao($linha['IDFiliacao']);
				}
			}
			return $valores;
		} catch (PDOException $e) {
			echo 'Erro <code>' . $e->getMessage() . '</code>';
		}
	}

	/**
	 *
	 *  deleteAnimal()
	 *
	 *  Deleta registros de Animais
	 *
	 *  @author  Bruno Pulis <bruno.pulis@gmail.com>
	 *  @access  public
	 *  @param   Animal $animal - Objeto da classe animal preenchido
	 *  @return resource
	 */
	public function deleteAnimal(Animal $animal) {
		try {
			$sql = 'DELETE FROM animal WHERE IDAnimal = ?';
			$db = $this->connection->prepare($sql);
			$db->bindParam(1, $animal->getIdAnimal(), PDO::PARAM_INT);
			$db->execute();
		} catch (PDOException $e) {
			echo $e->getMessage();
		}
	}

	/**
	 *
	 * updateAnimal()
	 *
	 * Atualiza registros de animais
	 *
	 * @author  Bruno Pulis <bruno.pulis@gmail.com>
	 * @package public
	 * @param   Animal $animal - Objeto da classe animal preenchido
	 * @return  resource
	 *
	 */
	public function updateAnimal(Animal $animal)
	{
		try {
			$sql = 'UPDATE animal
                    SET
                       nome       = ?,
                       foto       = ?,
                       raca       = ?,
                       tipoAnimal = ?,
                       sexo       = ?,
                       pelagem    = ?,
                       nascimento = ?,
                       municipio  = ?,
                       peso       = ?,
                       IDFiliacao = ?
                    WHERE
                       IDAnimal  = ?';
			$stmt = $this->connection->prepare($sql);

			$stmt->bindValue(1, $animal->getIdAnimal());
			$stmt->bindValue(2, $animal->getNomeAnimal());
			$stmt->bindValue(3, $animal->getFoto());
			$stmt->bindValue(4, $animal->getRaca());
			$stmt->bindValue(5, $animal->getTipoAnimal());
			$stmt->bindValue(6, $animal->getSexoAnimal());
			$stmt->bindValue(7, $animal->getPelagemAnimal());
			$stmt->bindValue(8, $animal->getDataNasc());
			$stmt->bindValue(9, $animal->getMunicipio());
			$stmt->bindValue(10, $animal->getPeso());
			$stmt->bindValue(11, $animal->getFiliacao());
			$stmt->execute();
		} catch (PDOException $e) {
			echo 'Erro <code>' . $e->getMessage() . '</code>';
		}
	}
}